[gcode_macro FILAMENT_CHANGE]
gcode:
    SAVE_GCODE_STATE NAME=FILAMENT_CHANGE_STATE
    {% set timer = params.T|default(300)|float %}
    {% set unload = params.U|default(100)|float %}
    {% set load = params.L|default(100)|float %}
    {% if printer.pause_resume.is_paused %}
        { action_respond_info("Already paused") }
    {% else %}
        {% if printer.toolhead.homed_axes != "xyz" %}
            { action_respond_info("Homing") }
            G28                                                                 # домой если не уже не дома)
        {% else %}
            { action_respond_info("Pausing print") }
            PAUSE
        {% endif %}
    {% endif %}
    { action_respond_info("Changing filament") } 
    SET_IDLE_TIMEOUT TIMEOUT=7200
    FILAMENT_UNLOAD U={unload}
    COUNTDOWN TIME={timer} MSG="Change filament! : "
    FILAMENT_LOAD L={load}
    RESTORE_GCODE_STATE NAME=FILAMENT_CHANGE_STATE
    {% if printer.pause_resume.is_paused %}
        { action_respond_info("continue print") } 
        RESUME
    {% endif %}

[gcode_macro FILAMENT_LOAD]
gcode:
    {% set load = params.L|default(100)|float * 0.5 %}
    {% set extruder_temp = params.T|default(240)|float %}
    SAVE_GCODE_STATE NAME=FILAMENT_LOAD_STATE
    LOW_TEMP_CHECK T={extruder_temp}
    { action_respond_info("Loading filament") }  
    M83                                                                         # относительное выдавливание
    G1 E{load} F720                                                           # быстрая часть загрузки
    G4 P1000                                                                    # ждем секунду
    G1 E{load} F200                                                             # медленно вторую половину
    #BEEP
    RESTORE_GCODE_STATE NAME=FILAMENT_LOAD_STATE

[gcode_macro FILAMENT_UNLOAD]
gcode:
    {% set unload = params.U|default(100)|float %}
    {% set extruder_temp = params.T|default(195)|float %} # температура по умолчанию 195.. правим если надо
    SAVE_GCODE_STATE NAME=FILAMENT_UNLOAD_STATE
    LOW_TEMP_CHECK T={extruder_temp}
    { action_respond_info("Unloading filament") }
    M83                                                                         # относительное выдавливание
    G1 E2  F200                                                                 # немного выдавливаем
    G1 E-10  F200                                                               # немного возвращаем
    G1 E-{unload} F720                                                         # вынимаем остаток
    BEEP
    RESTORE_GCODE_STATE NAME=FILAMENT_UNLOAD_STATE

[gcode_macro LOW_TEMP_CHECK]
gcode:
    {% set extruder_temp = params.T|default(240)|float %}
    {% if printer.extruder.target > extruder_temp %}                            # if there is a setpoint for extruder
        {% set extruder_temp = printer.extruder.target %}
    {% endif %}
    {% if printer.extruder.temperature < extruder_temp %}                       # нагрев до целевой температуры
        { action_respond_info("Heating to %s" % extruder_temp) } # я криворукий и что то неправильно пишуюю исправьте если можете
        SET_HEATER_TEMPERATURE HEATER=extruder TARGET={extruder_temp}
        TEMPERATURE_WAIT SENSOR=extruder MINIMUM={extruder_temp}
    {% endif %}
[gcode_macro M600]                                                              # коды чтобы в слайсере не заморачиваться
gcode:
    FILAMENT_CHANGE

[gcode_macro M701]                                                              # коды чтобы в слайсере не заморачиваться
gcode:
    FILAMENT_LOAD

[gcode_macro M702]                                                              # коды чтобы в слайсере не заморачиваться
gcode:
    FILAMENT_UNLOAD

[gcode_macro COUNTDOWN]
gcode:
    {% set timer = params.TIME|default(10)|int %}
    {% set message = params.MSG|default("Time: ") %}
    # countdown
    {% if timer > 60 %}
        {% for s in range(timer, 60, -10) %}
            M118 { "%s %s sec"%(message, s) }
            G4 P10000  # пауза 10 секунд
        {% endfor %}
        {% set timer = 60 %}
    {% endif %}
    {% if timer > 10 %}
        {% for s in range(timer, 10, -5) %}
            M118 { "%s %s sec"%(message, s) }
            G4 P5000   # пауза 5 секунд
        {% endfor %}
        {% set timer = 10 %}
    {% endif %}
    {% if timer > 0 %}
        {% for s in range(timer, 0, -1) %}
            M118 { "%s %s sec"%(message, s) }
            G4 P1000   # пауза 1 секунда
        {% endfor %}
    {% endif %}
    M118 { "%s finished"%(message) }
    BEEP